package fabrica2.persistencia;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import fabrica2.excecoes.DAOException;
import fabrica2.modelo.Evento;

public class EventoDAO extends GenericDAOImpl<Evento> implements Dao<Evento> {

	@Override
	public List<Evento> listar() throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Evento");
		Evento evento;
		List<Evento> eventos = new ArrayList<Evento>();
		try {
			while (rs.next()) {
				evento = new Evento();
				evento.setIdEvento(rs.getInt("id_evento"));
				evento.setIdCliente(rs.getInt("id_cliente"));
				evento.setDescricao(rs.getString("descricao"));
				evento.setDataInicio(rs.getDate("data_inicio"));
				evento.setDataFim(rs.getDate("data_fim"));
				evento.setEncerrado(rs.getString("descricao").toCharArray()[0]);
				eventos.add(evento);
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return eventos;
	}

	@Override
	public Evento persistir(Evento evento) throws DAOException {
		// verifica se existe no banco
		ResultSet rs = getResultSet("SELECT * FROM Evento where id_evento = "
				+ evento.getIdEvento());
		try {
			// Se existir atualiza
			if (rs.next()) {
				execute("UPDATE Evento SET descricao = '"
						+ evento.getDescricao() + "' , id_cliente = "
						+ evento.getIdCliente() + ", data_inicio = '"
						+ evento.getDataInicio() + "', data_fim = '"
						+ evento.getDataFim() + "', encerrado = '"
						+ evento.getEncerrado() + "')");
			}
			// Ou cria um novo
			else {
				execute("INSERT INTO Evento (id_cliente, descricao, data_inicio, data_fim, encerrado) VALUES ("
						+ ""
						+ evento.getIdCliente()
						+ ", "
						+ "'"
						+ evento.getDescricao()
						+ "', "
						+ "'"
						+ evento.getDataInicio()
						+ "', "
						+ "'"
						+ evento.getDataFim()
						+ "', "
						+ "'"
						+ evento.getEncerrado() + "'" + ")");
				String update = "SELECT * FROM Evento where id_cliente = "
						+ evento.getIdCliente() + " AND descricao = '"
						+ evento.getDescricao() + "' AND data_inicio = '"
						+ evento.getDataInicio() + "' AND data_fim = '"
						+ evento.getDataFim() + "' AND encerrado = '"
						+ evento.getEncerrado() + "'";
				rs = getResultSet(update);
				if (rs.next()) {
					evento.setIdEvento(rs.getInt("id_evento"));
				}
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return evento;
	}

	@Override
	public void remover(Evento evento) throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Evento WHERE id_evento = "
				+ evento.getIdEvento());
		try {
			if (rs.next()) {
				execute("DELETE FROM Evento where id_evento = "
						+ evento.getIdEvento());
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
	}

	public List<Evento> getEventosPorDescricao(String chaveDeBusca)
			throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Evento WHERE descricao LIKE '%"
				+ chaveDeBusca + "%'");
		Evento evento;
		List<Evento> eventos = new ArrayList<Evento>();
		try {
			while (rs.next()) {
				evento = new Evento();
				evento.setIdEvento(rs.getInt("id_evento"));
				evento.setIdCliente(rs.getInt("id_cliente"));
				evento.setDescricao(rs.getString("descricao"));
				evento.setDataInicio(rs.getDate("data_inicio"));
				evento.setDataFim(rs.getDate("data_fim"));
				evento.setEncerrado(rs.getString("descricao").toCharArray()[0]);
				eventos.add(evento);
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return eventos;
	}

	public List<Evento> getEventosAbertos() throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Evento WHERE encerrado = n");
		Evento evento;
		List<Evento> eventos = new ArrayList<Evento>();
		try {
			while (rs.next()) {
				evento = new Evento();
				evento.setIdEvento(rs.getInt("id_evento"));
				evento.setIdCliente(rs.getInt("id_cliente"));
				evento.setDescricao(rs.getString("descricao"));
				evento.setDataInicio(rs.getDate("data_inicio"));
				evento.setDataFim(rs.getDate("data_fim"));
				evento.setEncerrado(rs.getString("descricao").toCharArray()[0]);
				eventos.add(evento);
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return eventos;
	}

	public List<Evento> getEventosPorCliente(int idCliente) throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Evento WHERE id_cliente = "
				+ idCliente);
		Evento evento;
		List<Evento> eventos = new ArrayList<Evento>();
		try {
			while (rs.next()) {
				evento = new Evento();
				evento.setIdEvento(rs.getInt("id_evento"));
				evento.setIdCliente(rs.getInt("id_cliente"));
				evento.setDescricao(rs.getString("descricao"));
				evento.setDataInicio(rs.getDate("data_inicio"));
				evento.setDataFim(rs.getDate("data_fim"));
				evento.setEncerrado(rs.getString("descricao").toCharArray()[0]);
				eventos.add(evento);
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return eventos;
	}

	public List<Evento> getEventosEncerrados() throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Evento WHERE encerrado = s");
		Evento evento;
		List<Evento> eventos = new ArrayList<Evento>();
		try {
			while (rs.next()) {
				evento = new Evento();
				evento.setIdEvento(rs.getInt("id_evento"));
				evento.setIdCliente(rs.getInt("id_cliente"));
				evento.setDescricao(rs.getString("descricao"));
				evento.setDataInicio(rs.getDate("data_inicio"));
				evento.setDataFim(rs.getDate("data_fim"));
				evento.setEncerrado(rs.getString("descricao").toCharArray()[0]);
				eventos.add(evento);
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return eventos;
	}

	public List<Evento> getEventosEncerradosPorCliente(int idCliente)
			throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Evento WHERE encerrado = s AND id_cliente = "
				+ idCliente);
		Evento evento;
		List<Evento> eventos = new ArrayList<Evento>();
		try {
			while (rs.next()) {
				evento = new Evento();
				evento.setIdEvento(rs.getInt("id_evento"));
				evento.setIdCliente(rs.getInt("id_cliente"));
				evento.setDescricao(rs.getString("descricao"));
				evento.setDataInicio(rs.getDate("data_inicio"));
				evento.setDataFim(rs.getDate("data_fim"));
				evento.setEncerrado(rs.getString("descricao").toCharArray()[0]);
				eventos.add(evento);
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return eventos;
	}

	@Override
	public Evento getPorId(int id) throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Evento WHERE id_evento = "
				+ id);
		Evento evento = new Evento();
		try {
			while (rs.next()) {
				evento.setIdEvento(rs.getInt("id_evento"));
				evento.setIdCliente(rs.getInt("id_cliente"));
				evento.setDescricao(rs.getString("descricao"));
				evento.setDataInicio(rs.getDate("data_inicio"));
				evento.setDataFim(rs.getDate("data_fim"));
				evento.setEncerrado(rs.getString("descricao").toCharArray()[0]);

			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}
		return evento;
	}

	@Override
	public void removerPorId(int id) throws DAOException {
		ResultSet rs = getResultSet("SELECT * FROM Evento WHERE id_evento = "
				+ id);
		try {
			if (rs.next()) {
				execute("DELETE FROM Evento where id_evento = " + id);
			}
		} catch (SQLException e) {
			throw new DAOException();
		} finally {
			desconectar();
		}

	}

}
